home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
051-075
/
056
/
clipboard
/
cbio.c
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
5KB
|
200 lines
/*********************************************************************/
/* */
/* Program name: cbio */
/* */
/* Purpose: To provide standard clipboard device interface routines*/
/* such as Open, Post, Read, Write, etc. */
/* (C) 1986 Commodore-Amiga, Inc. */
/* Permission given to use and distribute this code as long as this */
/* notice remains intact. */
/*********************************************************************/
#include "exec/types.h"
#include "exec/ports.h"
#include "exec/io.h"
#include "devices/clipboard.h"
struct IOClipReq clipboardIO = 0;
struct MsgPort clipboardMsgPort = 0;
struct MsgPort satisfyMsgPort = 0;
int CBOpen(unit)
int unit;
{
int error;
/* open the clipboard device */
if ((error = OpenDevice("clipboard.device", unit, &clipboardIO, 0)) != 0)
return(error);
/* Set up the message port in the I/O request */
clipboardMsgPort.mp_Node.ln_Type = NT_MSGPORT;
clipboardMsgPort.mp_Flags = 0;
clipboardMsgPort.mp_SigBit = AllocSignal(-1);
clipboardMsgPort.mp_SigTask = (struct Task *) FindTask((char *) NULL);
AddPort(&clipboardMsgPort);
clipboardIO.io_Message.mn_ReplyPort = &clipboardMsgPort;
satisfyMsgPort.mp_Node.ln_Type = NT_MSGPORT;
satisfyMsgPort.mp_Flags = 0;
satisfyMsgPort.mp_SigBit = AllocSignal(-1);
satisfyMsgPort.mp_SigTask = (struct Task *) FindTask((char *) NULL);
AddPort(&satisfyMsgPort);
return(0);
}
CBClose()
{
RemPort(&satisfyMsgPort);
RemPort(&clipboardMsgPort);
CloseDevice(&clipboardIO);
}
CBSatisfyPost(string,length)
char *string;
int length;
{
clipboardIO.io_Offset = 0;
writeLong("FORM");
length += 12;
writeLong(&length);
writeLong("FTXT");
writeLong("CHRS");
length -= 12;
writeLong(&length);
clipboardIO.io_Command = CMD_WRITE;
clipboardIO.io_Data = string;
clipboardIO.io_Length = length;
DoIO(&clipboardIO);
clipboardIO.io_Command = CMD_UPDATE;
return(DoIO(&clipboardIO));
}
writeLong(ldata)
LONG *ldata;
{
int status;
clipboardIO.io_Command = CMD_WRITE;
clipboardIO.io_Data = ldata;
clipboardIO.io_Length = 4;
status=(DoIO(&clipboardIO));
}
CBCutS(string,length)
char *string;
int length;
{
clipboardIO.io_ClipID = 0;
return(CBSatisfyPost(string,length));
}
int
CBPasteS(string)
char *string;
{
int length=0,status=0;
clipboardIO.io_Command = CMD_READ; /* get the FORM */
clipboardIO.io_Data = string;
clipboardIO.io_Length = 4;
clipboardIO.io_Offset = 0;
clipboardIO.io_ClipID = 0;
status -= DoIO(&clipboardIO);
string[4]='\0';
if(!strcmp(string,"FORM")) { /* iff form */
clipboardIO.io_Command = CMD_READ; /* get the total length */
clipboardIO.io_Data = &length;
clipboardIO.io_Length = 4;
status -=DoIO(&clipboardIO);
clipboardIO.io_Command = CMD_READ; /* read the chunk and body */
clipboardIO.io_Data = string;
clipboardIO.io_Length = 8;
status -=DoIO(&clipboardIO);
string[8]='\0';
if(!strcmp(string,"FTXTCHRS")) {
clipboardIO.io_Command = CMD_READ; /* get the length of the data */
clipboardIO.io_Data = &length;
clipboardIO.io_Length = 4;
status -=DoIO(&clipboardIO);
clipboardIO.io_Command = CMD_READ;
clipboardIO.io_Data = string;
clipboardIO.io_Length = length;
status -=DoIO(&clipboardIO);
}
}
/* force end of file to terminate read */
clipboardIO.io_Command = CMD_READ;
clipboardIO.io_Length = 1;
clipboardIO.io_Data = 0;
status -= DoIO(&clipboardIO);
if(!status)return(length);
else return(-1);
}
int
CBCurrentReadID()
{
clipboardIO.io_Command = CBD_CURRENTREADID;
DoIO(&clipboardIO);
return(clipboardIO.io_ClipID);
}
int
CBCurrentWriteID()
{
clipboardIO.io_Command = CBD_CURRENTWRITEID;
DoIO(&clipboardIO);
return(clipboardIO.io_ClipID);
}
BOOL
CBCheckSatisfy(idVar)
int *idVar;
{
struct SatisfyMsg *sm;
if (*idVar == 0)
return(TRUE);
if (*idVar < CBCurrentWriteID()) {
*idVar = 0;
return(TRUE);
}
if (sm = (struct SatisfyMsg *) GetMsg(&satisfyMsgPort)) {
if (*idVar == sm->sm_ClipID)
return(TRUE);
}
return(FALSE);
}
CBCut(stream, length)
char *stream;
int length;
{
clipboardIO.io_Command = CMD_WRITE;
clipboardIO.io_Data = stream;
clipboardIO.io_Length = length;
clipboardIO.io_Offset = 0;
clipboardIO.io_ClipID = 0;
DoIO(&clipboardIO);
clipboardIO.io_Command = CMD_UPDATE;
DoIO(&clipboardIO);
}
int
CBPost()
{
clipboardIO.io_Command = CBD_POST;
clipboardIO.io_Data = &satisfyMsgPort;
clipboardIO.io_ClipID = 0;
DoIO(&clipboardIO);
return(clipboardIO.io_ClipID);
}